package com.atguigu.gmall.cart.controller;

import com.atguigu.gmall.common.bean.ResponseVo;
import com.atguigu.gmall.common.exception.CartException;
import com.atguigu.gmall.cart.interceptor.LoginInterceptor;
import com.atguigu.gmall.cart.pojo.Cart;
import com.atguigu.gmall.cart.pojo.UserInfo;
import com.atguigu.gmall.cart.service.CartService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author Jia Fa
 * @create 2021-12-19 18:47
 */
@Controller
public class CartController {

    /**比价或者商品实时价格同步  有货无货
     * 1 新增购物车商品时以 skuId:currentPrice 缓存到 Redis中  更新购物车商品不需要缓存
     * 2 查询商品时(不论是否登录) 均查询实时价格缓存
     * 3 pms模块修改商品价格后 通过MQ异步发送消息 Cart模块监听器获取消息,改变实时价格缓存
     */

    @Autowired
    CartService cartService;

    /**
     * 注意 由于是远程Feign访问 不能从拦截器中获取userId 所以需要传递过来userId 查询
     * @param userId
     * @return
     */
    @GetMapping("user/{userId}")
    @ApiOperation("根据userId 查询用户选中的购物车集合信息")
    @ResponseBody  // 注意不是返回页面了 远程调用返回VO集合对象
    public ResponseVo<List<Cart>> queryCheckCartByUserId(@PathVariable("userId")Long userId){
        List<Cart> carts = this.cartService.queryCheckCartByUserId(userId);
        return ResponseVo.ok(carts);
    }

    @GetMapping("test")
    public String test() {
        UserInfo userInfo = LoginInterceptor.getUserInfo();
        System.out.println("userInfo = " + userInfo);
        return "hello, cart";
    }

    /**
     * 添加购物车方法 完成后重定向到添加商品成功页面
     * 重定向到页面需要查询处该商品的部分信息 传递skuId过去
     * @param cart
     * @return
     */
    @GetMapping
    public String addCart(Cart cart) {  // cart内仅传递了skuId 和 count数据
        if (cart == null || cart.getSkuId() == null) {
            throw new CartException("添加的商品不存在");
        }
        this.cartService.addCart(cart);
        return "redirect:http://cart.gmall.com/addCart.html?skuId="+cart.getSkuId() + "&count=" + cart.getCount();
    }

    /**
     * 跳转到添加商品成功页面 需要skuId 查询商品的详细信息
     * @return
     */
    @GetMapping("addCart.html")
    public String toCartAddSuccess(Cart cart, Model model) {
        BigDecimal count = cart.getCount();
        cart = this.cartService.queryCartBySkuId(cart.getSkuId());
        cart.setCount(count);  // 在添加成功页面显示的是本次添加的商品数量
        model.addAttribute("cart", cart);
        return "addCart";
    }

    /**
     * 查询购物车方法  如果已登录则合并购物车
     * @param model
     * @return
     */
    @GetMapping("cart.html")
    public String queryCarts(Model model){
        List<Cart> carts =  this.cartService.queryCarts();
        model.addAttribute("carts", carts);
        return "cart";
    }


    /**
     * 修改商品数量
     * @param cart  json格式 {skuId: 30, count: 3}
     * @return
     */
    @PostMapping("updateNum")
    @ResponseBody
    public ResponseVo updateNum(@RequestBody Cart cart){
        this.cartService.updateNum(cart);
        return ResponseVo.ok();
    }

    /**
     * 删除购物车
     * @param skuId 商品skuId
     * @return
     */
    @PostMapping("deleteCart")
    @ResponseBody
    public ResponseVo deleteCart(@RequestParam("skuId")Long skuId){
        this.cartService.deleteCart(skuId);
        return ResponseVo.ok();
    }
}
